#
#  Copyright (c) 2016, The OpenThread Authors.
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#  3. Neither the name of the copyright holder nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.
#

include $(abs_top_nlbuild_autotools_dir)/automake/pre.am

lib_LIBRARIES                              = $(NULL)

if OPENTHREAD_ENABLE_FTD
lib_LIBRARIES                             += libopenthread-ftd.a
endif

if OPENTHREAD_ENABLE_MTD
lib_LIBRARIES                             += libopenthread-mtd.a
endif

if OPENTHREAD_ENABLE_RADIO_ONLY
lib_LIBRARIES                             += libopenthread-radio.a
endif

CPPFLAGS_COMMON                            = \
    -I$(top_srcdir)/include                  \
    $(OPENTHREAD_TARGET_DEFINES)             \
    $(NULL)

libopenthread_radio_a_CPPFLAGS             = \
    $(CPPFLAGS_COMMON)                       \
    -DOPENTHREAD_MTD=0                       \
    -DOPENTHREAD_FTD=0                       \
    -DOPENTHREAD_RADIO=1                     \
    $(NULL)

libopenthread_ftd_a_CPPFLAGS               = \
    $(CPPFLAGS_COMMON)                       \
    -DOPENTHREAD_MTD=0                       \
    -DOPENTHREAD_FTD=1                       \
    -DOPENTHREAD_RADIO=0                     \
    $(NULL)

libopenthread_mtd_a_CPPFLAGS               = \
    $(CPPFLAGS_COMMON)                       \
    -DOPENTHREAD_MTD=1                       \
    -DOPENTHREAD_FTD=0                       \
    -DOPENTHREAD_RADIO=0                     \
    $(NULL)

#------------------------------------------------------
# Note to maintainer/developers about "SOURCES_COMMON"
#
# The traditional method for GNU style Makefile.am files
# is to have IF statements within the Makefile
#
# These IF statements would add (or not add) certain
# source files from the build/library being built.
#
# In general, IDEs do not easily support this.
# Some do, some do not, those that do support it
# often do so in a very different or complex way.
# Bottom line: It is a very mixed bag of results.
#
# Thus we bend to the IDEs, and impose these rules:
#
# Rule #1
#     All code(files) should be compiled
#     Even if it is not used or required
#
#     For example: In the MTD build, some features
#     are disabled and thus in the traditional scheme
#     source files could be excluded SOURCES_COMMON
#     via makefile IF/ELSE/ENDIF constructs.
#
#     This makes it impossibly hard for IDEs.
#     Thus we compile everything.
#
#     And then rely upon Rule #2.
#
# Rule #2
#     Files that are not required, in certain
#     configurations require appropriate wrappers
#     Such as #if/#else/#endif
#
#     The net result is sort of an "empty translation
#     unit"
#

SOURCES_COMMON                             = \
    api/backbone_router_api.cpp              \
    api/backbone_router_ftd_api.cpp          \
    api/border_router_api.cpp                \
    api/channel_manager_api.cpp              \
    api/channel_monitor_api.cpp              \
    api/child_supervision_api.cpp            \
    api/coap_api.cpp                         \
    api/coap_secure_api.cpp                  \
    api/commissioner_api.cpp                 \
    api/crypto_api.cpp                       \
    api/dataset_api.cpp                      \
    api/dataset_ftd_api.cpp                  \
    api/diags_api.cpp                        \
    api/dns_api.cpp                          \
    api/entropy_api.cpp                      \
    api/heap_api.cpp                         \
    api/icmp6_api.cpp                        \
    api/instance_api.cpp                     \
    api/ip6_api.cpp                          \
    api/jam_detection_api.cpp                \
    api/joiner_api.cpp                       \
    api/link_api.cpp                         \
    api/link_raw_api.cpp                     \
    api/logging_api.cpp                      \
    api/message_api.cpp                      \
    api/netdata_api.cpp                      \
    api/netdiag_api.cpp                      \
    api/network_time_api.cpp                 \
    api/random_crypto_api.cpp                \
    api/random_noncrypto_api.cpp             \
    api/server_api.cpp                       \
    api/sntp_api.cpp                         \
    api/tasklet_api.cpp                      \
    api/thread_api.cpp                       \
    api/thread_ftd_api.cpp                   \
    api/udp_api.cpp                          \
    backbone_router/leader.cpp               \
    backbone_router/local.cpp                \
    coap/coap.cpp                            \
    coap/coap_message.cpp                    \
    coap/coap_secure.cpp                     \
    common/crc16.cpp                         \
    common/instance.cpp                      \
    common/logging.cpp                       \
    common/message.cpp                       \
    common/notifier.cpp                      \
    common/random_manager.cpp                \
    common/settings.cpp                      \
    common/string.cpp                        \
    common/tasklet.cpp                       \
    common/timer.cpp                         \
    common/tlvs.cpp                          \
    common/trickle_timer.cpp                 \
    crypto/aes_ccm.cpp                       \
    crypto/aes_ecb.cpp                       \
    crypto/ecdsa.cpp                         \
    crypto/hmac_sha256.cpp                   \
    crypto/mbedtls.cpp                       \
    crypto/pbkdf2_cmac.cpp                   \
    crypto/sha256.cpp                        \
    diags/factory_diags.cpp                  \
    mac/channel_mask.cpp                     \
    mac/data_poll_handler.cpp                \
    mac/data_poll_sender.cpp                 \
    mac/link_raw.cpp                         \
    mac/mac.cpp                              \
    mac/mac_filter.cpp                       \
    mac/mac_frame.cpp                        \
    mac/mac_types.cpp                        \
    mac/sub_mac.cpp                          \
    mac/sub_mac_callbacks.cpp                \
    meshcop/announce_begin_client.cpp        \
    meshcop/border_agent.cpp                 \
    meshcop/commissioner.cpp                 \
    meshcop/dataset.cpp                      \
    meshcop/dataset_local.cpp                \
    meshcop/dataset_manager.cpp              \
    meshcop/dataset_manager_ftd.cpp          \
    meshcop/dtls.cpp                         \
    meshcop/energy_scan_client.cpp           \
    meshcop/joiner.cpp                       \
    meshcop/joiner_router.cpp                \
    meshcop/meshcop.cpp                      \
    meshcop/meshcop_leader.cpp               \
    meshcop/meshcop_tlvs.cpp                 \
    meshcop/panid_query_client.cpp           \
    meshcop/timestamp.cpp                    \
    net/dhcp6_client.cpp                     \
    net/dhcp6_server.cpp                     \
    net/dns_client.cpp                       \
    net/icmp6.cpp                            \
    net/ip6.cpp                              \
    net/ip6_address.cpp                      \
    net/ip6_filter.cpp                       \
    net/ip6_headers.cpp                      \
    net/ip6_mpl.cpp                          \
    net/netif.cpp                            \
    net/sntp_client.cpp                      \
    net/udp6.cpp                             \
    radio/radio.cpp                          \
    radio/radio_callbacks.cpp                \
    radio/radio_platform.cpp                 \
    thread/address_resolver.cpp              \
    thread/announce_begin_server.cpp         \
    thread/announce_sender.cpp               \
    thread/child_table.cpp                   \
    thread/dua_manager.cpp                   \
    thread/energy_scan_server.cpp            \
    thread/indirect_sender.cpp               \
    thread/key_manager.cpp                   \
    thread/link_quality.cpp                  \
    thread/lowpan.cpp                        \
    thread/mesh_forwarder.cpp                \
    thread/mesh_forwarder_ftd.cpp            \
    thread/mesh_forwarder_mtd.cpp            \
    thread/mle.cpp                           \
    thread/mle_router.cpp                    \
    thread/mle_types.cpp                     \
    thread/network_data.cpp                  \
    thread/network_data_leader.cpp           \
    thread/network_data_leader_ftd.cpp       \
    thread/network_data_local.cpp            \
    thread/network_data_notifier.cpp         \
    thread/network_diagnostic.cpp            \
    thread/panid_query_server.cpp            \
    thread/router_table.cpp                  \
    thread/src_match_controller.cpp          \
    thread/thread_netif.cpp                  \
    thread/time_sync_service.cpp             \
    thread/topology.cpp                      \
    utils/channel_manager.cpp                \
    utils/channel_monitor.cpp                \
    utils/child_supervision.cpp              \
    utils/flash.cpp                          \
    utils/heap.cpp                           \
    utils/jam_detector.cpp                   \
    utils/otns.cpp                           \
    utils/parse_cmdline.cpp                  \
    utils/slaac_address.cpp                  \
    $(NULL)

EXTRA_DIST                                 = \
    common/extension_example.cpp             \
    $(NULL)

libopenthread_radio_a_SOURCES              = \
    api/diags_api.cpp                        \
    api/heap_api.cpp                         \
    api/instance_api.cpp                     \
    api/link_raw_api.cpp                     \
    api/logging_api.cpp                      \
    api/random_noncrypto_api.cpp             \
    api/tasklet_api.cpp                      \
    common/instance.cpp                      \
    common/logging.cpp                       \
    common/random_manager.cpp                \
    common/string.cpp                        \
    common/tasklet.cpp                       \
    common/timer.cpp                         \
    diags/factory_diags.cpp                  \
    mac/link_raw.cpp                         \
    mac/mac_frame.cpp                        \
    mac/mac_types.cpp                        \
    mac/sub_mac.cpp                          \
    mac/sub_mac_callbacks.cpp                \
    radio/radio.cpp                          \
    radio/radio_callbacks.cpp                \
    radio/radio_platform.cpp                 \
    thread/link_quality.cpp                  \
    utils/parse_cmdline.cpp                  \
    $(NULL)

libopenthread_mtd_a_SOURCES                = \
    $(SOURCES_COMMON)                        \
    $(NULL)

libopenthread_ftd_a_SOURCES                = \
    $(SOURCES_COMMON)                        \
    $(NULL)

if OPENTHREAD_ENABLE_VENDOR_EXTENSION

.INTERMEDIATE: vendor_extension_temp.cpp
vendor_extension_temp.cpp: ${OPENTHREAD_VENDOR_EXTENSION_SOURCE}
	$(AM_V_GEN)cp $< $@

# "nodist_" prefix tells automake not to include in 'make dist'

nodist_libopenthread_ftd_a_SOURCES         = \
    vendor_extension_temp.cpp                \
    $(NULL)

nodist_libopenthread_mtd_a_SOURCES         = \
    vendor_extension_temp.cpp                \
    $(NULL)

nodist_libopenthread_radio_a_SOURCES       = \
    vendor_extension_temp.cpp                \
    $(NULL)

endif # OPENTHREAD_ENABLE_VENDOR_EXTENSION

HEADERS_COMMON                             = \
    openthread-core-config.h                 \
    backbone_router/leader.hpp               \
    backbone_router/local.hpp                \
    coap/coap.hpp                            \
    coap/coap_message.hpp                    \
    coap/coap_secure.hpp                     \
    common/code_utils.hpp                    \
    common/crc16.hpp                         \
    common/debug.hpp                         \
    common/encoding.hpp                      \
    common/extension.hpp                     \
    common/instance.hpp                      \
    common/linked_list.hpp                   \
    common/locator.hpp                       \
    common/locator-getters.hpp               \
    common/logging.hpp                       \
    common/message.hpp                       \
    common/new.hpp                           \
    common/notifier.hpp                      \
    common/random.hpp                        \
    common/random_manager.hpp                \
    common/settings.hpp                      \
    common/string.hpp                        \
    common/tasklet.hpp                       \
    common/time.hpp                          \
    common/timer.hpp                         \
    common/tlvs.hpp                          \
    common/trickle_timer.hpp                 \
    config/announce_sender.h                 \
    config/backbone_router.h                 \
    config/border_router.h                   \
    config/channel_manager.h                 \
    config/channel_monitor.h                 \
    config/child_supervision.h               \
    config/coap.h                            \
    config/commissioner.h                    \
    config/dhcp6_client.h                    \
    config/dhcp6_server.h                    \
    config/diag.h                            \
    config/dns_client.h                      \
    config/ip6.h                             \
    config/joiner.h                          \
    config/link_quality.h                    \
    config/link_raw.h                        \
    config/logging.h                         \
    config/mac.h                             \
    config/mle.h                             \
    config/openthread-core-config-check.h    \
    config/openthread-core-default-config.h  \
    config/parent_search.h                   \
    config/platform.h                        \
    config/sntp_client.h                     \
    config/time_sync.h                       \
    config/tmf.h                             \
    crypto/aes_ccm.hpp                       \
    crypto/aes_ecb.hpp                       \
    crypto/ecdsa.hpp                         \
    crypto/hmac_sha256.hpp                   \
    crypto/mbedtls.hpp                       \
    crypto/pbkdf2_cmac.h                     \
    crypto/sha256.hpp                        \
    diags/factory_diags.hpp                  \
    mac/channel_mask.hpp                     \
    mac/data_poll_handler.hpp                \
    mac/data_poll_sender.hpp                 \
    mac/link_raw.hpp                         \
    mac/mac.hpp                              \
    mac/mac_filter.hpp                       \
    mac/mac_frame.hpp                        \
    mac/mac_types.hpp                        \
    mac/sub_mac.hpp                          \
    meshcop/announce_begin_client.hpp        \
    meshcop/border_agent.hpp                 \
    meshcop/commissioner.hpp                 \
    meshcop/dataset.hpp                      \
    meshcop/dataset_local.hpp                \
    meshcop/dataset_manager.hpp              \
    meshcop/dtls.hpp                         \
    meshcop/energy_scan_client.hpp           \
    meshcop/joiner.hpp                       \
    meshcop/joiner_router.hpp                \
    meshcop/meshcop.hpp                      \
    meshcop/meshcop_leader.hpp               \
    meshcop/meshcop_tlvs.hpp                 \
    meshcop/panid_query_client.hpp           \
    meshcop/timestamp.hpp                    \
    net/dhcp6.hpp                            \
    net/dhcp6_client.hpp                     \
    net/dhcp6_server.hpp                     \
    net/dns_client.hpp                       \
    net/dns_headers.hpp                      \
    net/icmp6.hpp                            \
    net/ip6.hpp                              \
    net/ip6_address.hpp                      \
    net/ip6_filter.hpp                       \
    net/ip6_headers.hpp                      \
    net/ip6_mpl.hpp                          \
    net/netif.hpp                            \
    net/sntp_client.hpp                      \
    net/socket.hpp                           \
    net/tcp.hpp                              \
    net/udp6.hpp                             \
    radio/radio.hpp                          \
    thread/address_resolver.hpp              \
    thread/announce_begin_server.hpp         \
    thread/announce_sender.hpp               \
    thread/child_table.hpp                   \
    thread/dua_manager.hpp                   \
    thread/energy_scan_server.hpp            \
    thread/indirect_sender.hpp               \
    thread/indirect_sender_frame_context.hpp \
    thread/key_manager.hpp                   \
    thread/link_quality.hpp                  \
    thread/lowpan.hpp                        \
    thread/mesh_forwarder.hpp                \
    thread/mle.hpp                           \
    thread/mle_router.hpp                    \
    thread/mle_tlvs.hpp                      \
    thread/mle_types.hpp                     \
    thread/network_data.hpp                  \
    thread/network_data_leader.hpp           \
    thread/network_data_leader_ftd.hpp       \
    thread/network_data_local.hpp            \
    thread/network_data_notifier.hpp         \
    thread/network_data_tlvs.hpp             \
    thread/network_diagnostic.hpp            \
    thread/network_diagnostic_tlvs.hpp       \
    thread/panid_query_server.hpp            \
    thread/router_table.hpp                  \
    thread/src_match_controller.hpp          \
    thread/thread_netif.hpp                  \
    thread/thread_tlvs.hpp                   \
    thread/thread_uri_paths.hpp              \
    thread/time_sync_service.hpp             \
    thread/topology.hpp                      \
    utils/channel_manager.hpp                \
    utils/channel_monitor.hpp                \
    utils/child_supervision.hpp              \
    utils/flash.hpp                          \
    utils/heap.hpp                           \
    utils/jam_detector.hpp                   \
    utils/otns.hpp                           \
    utils/parse_cmdline.hpp                  \
    utils/slaac_address.hpp                  \
    utils/static_assert.hpp                  \
    $(NULL)

noinst_HEADERS                             = \
    $(HEADERS_COMMON)                        \
    $(NULL)

if OPENTHREAD_BUILD_COVERAGE
Dash       = -
CLEANFILES = $(shell find $(top_builddir)/src/core $(Dash)name "*.gcda" $(Dash)o $(Dash)name "*.gcno")
endif

include $(abs_top_nlbuild_autotools_dir)/automake/post.am
